<!DOCTYPE html>
<html>

<head>

    <script type="module">

        /*
        Object.create(proto[,propertiesObject])
            参数
            proto
            创建对象的原型，表示要继承的对象

            propertiesObject(可选 )
            也是一个对象，用于对新创建的对象进行初始化
        */
        let obj={"name":"szq","age":30};
        // 对象的拷贝--》 实现从原型和属性的拷贝（注意是浅拷贝）
        let obj_copy = Object.create(
                                    Object.getPrototypeOf(obj), //obj的原型作为obj_copy的原型
                                    Object.getOwnPropertyDescriptors(obj) // obj对象的属性 作为obj_copy的属性
                                    );
        console.log(obj_copy.__proto__ === Object.getPrototypeOf(obj)); // true

        // 另一种写法
        let obj_copy2=Object.create(null);
        Object.setPrototypeOf(obj_copy2,Reflect.getPrototypeOf(obj));
        Object.defineProperties(obj_copy2,Object.getOwnPropertyDescriptors(obj));
        console.log(obj_copy2);



        // let obj_copy2 = Object.create(
        // obj, //obj作为obj_copy2的原型 
        // Object.getOwnPropertyDescriptors(obj) //  obj对象的属性 作为obj_copy2的属性
        // );
        // console.log(obj_copy2.__proto__ === obj); // true

        // /**
        // 一、Object.assign是什么？
        // object.assign()主要用于对象合并，将源对象中的属性复制到目标对象中，他将返回目标对象。
        // 二、用法：
        // Object.assign(target, ...sources)
        // 参数：target---目标对象
        //      source---源对象
        // 返回值: target目标对象 
        // */

        // let obj_1 = { "name": "szq", "age": 30 };

        // let obj_2 = { "name": "syh", "age": 12 };

        // let target = Object.assign(obj_1, obj_2);

        // // 对象的拷贝--》 实现从原型和属性的拷贝（注意是浅拷贝）
        // let target_1 = Object.assign(Object.create(Object.getPrototypeOf(obj_1)), obj_1);
        // // target_1.__proto__ === Object.getPrototypeOf(obj_1) true

        /**
         Object.getOwnPropertyDescriptors()也可以用来实现 Mixin（混入）模式。
        */
        let mix = (object) => ({
            // with: (...mixins) => mixins.reduce(
            //     (c, mixin) => Object.create(
            //         c, Object.getOwnPropertyDescriptors(mixin)
            //     ), object)
            with:(...array)=>{
                
                array.map(value=>{
                    object= Object.assign(Object.create(object),value);
                })
                return object;

            }
        });

        // multiple mixins example
        let a = { a: 'a' };
        let b = { b: 'b' };
        let c = { c: 'c' };
        let d = mix(c).with(a, b);
        console.log(d);

    </script>
</head>

<body>

    <div id="mydiv"></div>

</body>

</html>